package com.ww.core.utils.mapper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;

import com.ww.core.utils.ReflectionUtils;

/**
 * 提出集合中的元素对象的属性(通过Getter函数),组合成新的集合.
 * 
 */
public class CollectionMapper {

        /**
         * 提取集合中的对象的属性(通过Getter函数), 组合成Map.
         * 
         * @param collection 来源集合.
         * @param keyPropertyName 要提取为Map中的Key值的属性名.
         * @param valuePropertyName 要提取为Map中的Value值的属性名.
         */
        public static Map extractToMap(final Collection collection, final String keyPropertyName,
                        final String valuePropertyName) {
                Map map = new HashMap();

                try {
                        for (Object obj : collection) {
                                map.put(PropertyUtils.getProperty(obj, keyPropertyName),
                                                PropertyUtils.getProperty(obj, valuePropertyName));
                        }
                } catch (Exception e) {
                        throw ReflectionUtils.convertReflectionExceptionToUnchecked(e);
                }

                return map;
        }

        /**
         * 提取集合中的对象的属性(通过Getter函数), 组合成List.
         * 
         * @param collection 来源集合.
         * @param propertyName 要提取的属性名.
         */
        public static List extractToList(final Collection collection, final String propertyName) {
                List list = new ArrayList();

                try {
                        for (Object obj : collection) {
                                list.add(PropertyUtils.getProperty(obj, propertyName));
                        }
                } catch (Exception e) {
                        throw ReflectionUtils.convertReflectionExceptionToUnchecked(e);
                }

                return list;
        }

        /**
         * 提取集合中的对象的属性(通过Getter函数), 组合成由分割符分隔的字符串.
         * 
         * @param collection 来源集合.
         * @param propertyName 要提取的属性名.
         * @param separator 分隔符.
         */
        public static String extractToString(final Collection collection, final String propertyName, final String separator) {
                List list = extractToList(collection, propertyName);
                return StringUtils.join(list, separator);
        }
}
